package br.edu.universo.si.projeto2.infojob.server.persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import br.edu.universo.si.projeto2.infojob.client.bean.BeanEmpresaAssinante;
import br.edu.universo.si.projeto2.infojob.server.Database;
import br.edu.universo.si.projeto2.infojob.server.excecoes.ContaExistenteException;

/**
 * Classe de persistência de Empresa.
 */
public class PEmpresa
{
	/**
	 * Cadastra uma empresa. 
	 * @param bEmpresaAssinante
	 * @throws ClassNotFoundException
	 * @throws ContaExistenteException
	 * @throws Exception
	 */
	public static void cadastrarEmpresaAssinante(BeanEmpresaAssinante bEmpresaAssinante)
		throws ClassNotFoundException, ContaExistenteException, Exception
	{
		Database database = Database.getInstance();

		String SQL = "INSERT INTO infojob.tb_empresa_assinante(cnpj, razao_social, responsavel, telefone, " +
				"email, cpf_responsavel, rg_responsavel, endereco, numero, bairro, " +
				"complemento, cidade, id_estado, cep, conta, senha) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, md5(?))";

		PreparedStatement pStmt = database.getPreparedStatement(SQL);

		pStmt.setString(1, bEmpresaAssinante.getCnpj());
		pStmt.setString(2, bEmpresaAssinante.getRazaoSocial());
		pStmt.setString(3, bEmpresaAssinante.getResponsavel());
		pStmt.setString(4, bEmpresaAssinante.getTelefone());
		pStmt.setString(5, bEmpresaAssinante.getEmail());
		pStmt.setString(6, bEmpresaAssinante.getCpfResponsavel());
		pStmt.setString(7, bEmpresaAssinante.getRgResponsavel());
		pStmt.setString(8, bEmpresaAssinante.getEndereco());
		pStmt.setInt(9, bEmpresaAssinante.getNumero());
		pStmt.setString(10, bEmpresaAssinante.getBairro());
		pStmt.setString(11, bEmpresaAssinante.getComplemento());
		pStmt.setString(12, bEmpresaAssinante.getCidade());

		if (bEmpresaAssinante.getBEstado().getId() == -1)
		{
			pStmt.setNull(13, java.sql.Types.NULL);
		}
		else
		{
			pStmt.setInt(13, bEmpresaAssinante.getBEstado().getId());
		}

		pStmt.setString(14, bEmpresaAssinante.getCep());
		pStmt.setString(15, bEmpresaAssinante.getConta());
		pStmt.setString(16, bEmpresaAssinante.getSenha());

		pStmt.executeUpdate();
	}

	/**
	 * Busca uma empresa pelo ID.
	 * @param idEmpresa
	 * @return
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public static BeanEmpresaAssinante getEmpresaById(Integer idEmpresa) throws ClassNotFoundException, SQLException
	{
		Database database = Database.getInstance();
	
		String query = ("SELECT * FROM infojob.tb_empresa_assinante WHERE id = ?; ");

		PreparedStatement pStmt = database.getPreparedStatement(query);
		pStmt.setInt(1, idEmpresa);

		ResultSet rs = pStmt.executeQuery();
		
		if(rs.next())
		{
			BeanEmpresaAssinante bEmpresaAssinante = new BeanEmpresaAssinante();

			bEmpresaAssinante.setId(rs.getInt("id"));
			bEmpresaAssinante.setCnpj(rs.getString("cnpj"));
			bEmpresaAssinante.setRazaoSocial(rs.getString("razao_social"));
			bEmpresaAssinante.setResponsavel(rs.getString("responsavel"));
			bEmpresaAssinante.setCpfResponsavel(rs.getString("cpf_responsavel"));
			bEmpresaAssinante.setRgResponsavel(rs.getString("rg_responsavel"));
			bEmpresaAssinante.setTelefone(rs.getString("telefone"));
			bEmpresaAssinante.setEmail(rs.getString("email"));
			bEmpresaAssinante.setEndereco(rs.getString("endereco"));
			bEmpresaAssinante.setNumero(rs.getString("numero"));
			bEmpresaAssinante.setBairro(rs.getString("bairro"));
			bEmpresaAssinante.setComplemento(rs.getString("complemento"));
			bEmpresaAssinante.setCidade(rs.getString("cidade"));
			bEmpresaAssinante.setBEstado(PEstado.getEstadoById(rs.getInt("id_estado")));
			bEmpresaAssinante.setCep(rs.getString("cep"));
			bEmpresaAssinante.setConta(rs.getString("conta"));
			
			return bEmpresaAssinante;
		}

		return null;
	}

	/**
	 * Altera os dados de uma empresa.
	 * @param bEmpresaAssinante
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public static void alterarDadosEmpresaAssinante(BeanEmpresaAssinante bEmpresaAssinante)
		throws ClassNotFoundException, SQLException
	{

		Database database = Database.getInstance();
		
		PreparedStatement pStmt = database.getPreparedStatement("UPDATE infojob.tb_empresa_assinante " +
				"SET cnpj = ?, razao_social = ?, responsavel = ?, telefone = ?, email = ?, cpf_responsavel = ?, rg_responsavel =  ?, " +
				"endereco = ?, numero = ?, bairro = ?, complemento = ?, cidade = ?, id_estado = ?, cep = ? WHERE id = ?;");

		pStmt.setString(1, bEmpresaAssinante.getCnpj());
		pStmt.setString(2 , bEmpresaAssinante.getRazaoSocial());
		pStmt.setString(3 , bEmpresaAssinante.getResponsavel());
		pStmt.setString(4 , bEmpresaAssinante.getTelefone());
		pStmt.setString(5 , bEmpresaAssinante.getEmail());
		pStmt.setString(6 , bEmpresaAssinante.getCpfResponsavel());
		pStmt.setString(7 , bEmpresaAssinante.getRgResponsavel());
		pStmt.setString(8 , bEmpresaAssinante.getEndereco());
		pStmt.setInt(9 , bEmpresaAssinante.getNumero());
		pStmt.setString(10 , bEmpresaAssinante.getBairro());
		pStmt.setString(11 , bEmpresaAssinante.getComplemento());
		pStmt.setString(12 , bEmpresaAssinante.getCidade());

		if (bEmpresaAssinante.getBEstado().getId() == -1)
		{
			pStmt.setNull(13, java.sql.Types.NULL);
		}
		else
		{
			pStmt.setInt(13, bEmpresaAssinante.getBEstado().getId());
		}

		pStmt.setString(14, bEmpresaAssinante.getCep());
		pStmt.setInt(15, bEmpresaAssinante.getId());

		pStmt.executeUpdate();
			
	}

	/**
	 * Verifica se o CNPJ está cadastrado.
	 * @author Andrey A. de Oliveira
	 * @param CNPJ
	 * @return boolean
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public static boolean isCNPJCadastrado(String CNPJ) throws ClassNotFoundException, SQLException
	{
		Database database = Database.getInstance();

		PreparedStatement pStmt = database.getPreparedStatement(
				"SELECT * FROM infojob.tb_empresa_assinante WHERE cnpj = ?; ");

		pStmt.setString(1, CNPJ);
		ResultSet rs = pStmt.executeQuery();

		if (rs.next())
		{
			return true;
		}
		
		return false;
	}

	/**
	 * Verifica se o ID é de uma empresa de fato.
	 * @author Andrey A. de Oliveira
	 * @param idAssinante
	 * @return boolean
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public static boolean isEmpresa(Integer idAssinante) throws ClassNotFoundException, SQLException
	{
		Database database = Database.getInstance();

		PreparedStatement pStmt = database.getPreparedStatement("SELECT * FROM infojob.tb_empresa_assinante WHERE id = ?; ");

		pStmt.setInt(1, idAssinante);

		ResultSet rs = pStmt.executeQuery();

		if (rs.next())
		{
			return true;
		}

		return false;
	}

	/**
	 * Exclui empresa com controle transacional.
	 * @author Andrey A. de Oliveira
	 * @param conn
	 * @param bEmpresaAssinante
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public static void excluirEmpresa(Connection conn, BeanEmpresaAssinante bEmpresaAssinante)
		throws ClassNotFoundException, SQLException
	{
		Database database = Database.getInstance();

		PreparedStatement pstmt = 
			database.getPreparedStatement(conn, "DELETE FROM infojob.tb_empresa_assinante WHERE id = ?; ");

		pstmt.setInt(1, bEmpresaAssinante.getId());

		pstmt.executeUpdate();
	}

	/**
	 * Exclui perfil de uma empresa com controle transacional.
	 * @author Marcelo M. Fleury
	 * @param conn
	 * @param bEmpresaAssinante
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public static void excluirEmpresaPerfil(Connection conn, BeanEmpresaAssinante bEmpresaAssinante)
		throws ClassNotFoundException, SQLException
	{
		Database database = Database.getInstance();

		PreparedStatement pstmt = 
			database.getPreparedStatement(conn, "DELETE FROM infojob.tb_empresa_perfil WHERE id_empresa = ?; ");

		pstmt.setInt(1, bEmpresaAssinante.getId());

		pstmt.executeUpdate();
	}
}